package com.rabbitmq.producer.service;

import com.rabbitmq.producer.entity.Order;
import com.rabbitmq.producer.utils.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * @Author: Thomas
 * @Date: 2024-01-14  21:10:44
 * @Description:
 */
@Service
@Slf4j
public class orderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 模拟用户下单
     * @param userId    : 用户ID
     * @param produceId : 产品ID
     * @param num       : 数量
     */
    public void makeOrder(String userId, String produceId, int num) {
        // 1. 根据produceId查询产品是否充足

        // 2. 保存订单
        String uuid = UUID.randomUUID().toString();
        Order order = new Order(produceId, uuid, userId, 123.2345);
        log.info("用户ID：{} 产品ID：{} 订单ID:{}", userId, produceId, uuid);
        // 3. 通过MQ实现消息的分发
        // 参数1:交换机  参数2:路由key/queue名称（工作模式）  参数3:消息内容
        String exchangeName = "fanout_order_exchange";
        String routingKey = "";
        rabbitTemplate.convertAndSend(exchangeName, routingKey, JSONUtil.toJson(order));
    }

    /**
     * 模拟用户下单
     * @param userId    : 用户ID
     * @param produceId : 产品ID
     * @param num       : 数量
     */
    public void makeOrderDirect(String userId, String produceId, int num) {
        // 1. 根据produceId查询产品是否充足

        // 2. 保存订单
        String uuid = UUID.randomUUID().toString();
        Order order = new Order(produceId, uuid, userId, 123.2345);
        log.info("用户ID：{} 产品ID：{} 订单ID:{}", userId, produceId, uuid);
        // 3. 通过MQ实现消息的分发
        // 参数1:交换机  参数2:路由key/queue名称（工作模式）  参数3:消息内容
        String exchangeName = "direct_order_exchange";
        rabbitTemplate.convertAndSend(exchangeName, "email", JSONUtil.toJson(order));
        rabbitTemplate.convertAndSend(exchangeName, "message", JSONUtil.toJson(order));
    }

    /**
     * 模拟用户下单
     * @param userId    : 用户ID
     * @param produceId : 产品ID
     * @param num       : 数量
     */
    public void makeOrderTopic(String userId, String produceId, int num) {
        // 1. 根据produceId查询产品是否充足

        // 2. 保存订单
        String uuid = UUID.randomUUID().toString();
        Order order = new Order(produceId, uuid, userId, 123.2345);
        log.info("用户ID：{} 产品ID：{} 订单ID:{}", userId, produceId, uuid);
        // 3. 通过MQ实现消息的分发
        // 参数1:交换机  参数2:路由key/queue名称（工作模式）  参数3:消息内容
        String exchangeName = "topic_order_exchange";
        // sms: #.sms.#
        // message: com.*
        // email: *.email.#
        rabbitTemplate.convertAndSend(exchangeName, "com.email", JSONUtil.toJson(order));
    }


    /**
     * 模拟用户下单
     * @param userId    : 用户ID
     * @param produceId : 产品ID
     * @param num       : 数量
     */
    public void makeOrderFanoutTTL(String userId, String produceId, int num) {
        // 1. 根据produceId查询产品是否充足

        // 2. 保存订单
        String uuid = UUID.randomUUID().toString();
        Order order = new Order(produceId, uuid, userId, 123.2345);
        log.info("用户ID：{} 产品ID：{} 订单ID:{}", userId, produceId, uuid);
        // 3. 通过MQ实现消息的分发
        // 参数1:交换机  参数2:路由key/queue名称（工作模式）  参数3:消息内容
        String exchangeName = "fanout_ttl_order_exchange";
        // sms: #.sms.#
        // message: com.*
        // email: *.email.#
        rabbitTemplate.convertAndSend(exchangeName, "", JSONUtil.toJson(order));
    }

    /**
     * 模拟用户下单
     * @param userId    : 用户ID
     * @param produceId : 产品ID
     * @param num       : 数量
     */
    public void makeOrderFanoutTTLMessage(String userId, String produceId, int num) {
        // 1. 根据produceId查询产品是否充足

        // 2. 保存订单
        String uuid = UUID.randomUUID().toString();
        Order order = new Order(produceId, uuid, userId, 123.2345);
        log.info("用户ID：{} 产品ID：{} 订单ID:{}", userId, produceId, uuid);
        // 3. 通过MQ实现消息的分发
        // 参数1:交换机  参数2:路由key/queue名称（工作模式）  参数3:消息内容
        String exchangeName = "fanout_ttl_message_order_exchange";
        // 给消息设置过期时间
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {

            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                // 给消息设置20秒过期
                message.getMessageProperties().setExpiration("20000");
                // 设置编码
                message.getMessageProperties().setContentEncoding("UTF-8");
                return message;
            }
        };
        if (num != 0) {
            rabbitTemplate.convertAndSend(exchangeName, "", JSONUtil.toJson(order), messagePostProcessor);
        } else {
            rabbitTemplate.convertAndSend(exchangeName, "", JSONUtil.toJson(order));
        }
    }


}
